<?php

namespace app\payment\admin;

use app\common\builder\ZBuilder;
use app\payment\model\PaymentTest as PaymentTestModel;
use app\payment\model\AllPaymentCompany as AllPaymentCompanyModel;
use app\payment\model\PaymentPayCompany as PaymentPayCompanyModel;
use app\payment\model\Order as OrderModel;
use app\payment\model\Paid as PaidOrderModel;
use app\payment\model\AlipayPaid as AlipayPaidOrderModel;
use app\payment\model\PaymentPaidCompany as PaymentPaidCompanyModel;
use app\payment\model\PaymentWithdrawalCompany as PaymentWithdrawalCompanyModel;
use app\api\model\PaymentOrderPaid as PaymentOrderPaidModel;
use app\api\model\PaymentOrderAlipayPaid as PaymentOrderAlipayPaidModel;
use app\api\model\PaymentWithdrawalApi as PaymentWithdrawalApiModel;
use think\facade\Request;

/**
 * 支付测试控制器
 */
class Test extends Index
{

    protected function initialize()
    {
        parent::initialize();
        if ($this->no_auth) {
            $this->error('权限不足！');
        }

        if (in_array(request()->action(), ['delete'])) {
            if (!$this->delete_safe) {
                $this->error('NO');
            }
        }
    }

    /**
     * 首页
     * @return mixed
     */
    public function index()
    {
        // 设置搜索参数
        $search = ['class' => '测试类型', 'company_name' => '支付公司名称', 'company_title' => '支付公司标题', 'child_company_name' => '支付公司商户号名称', 'child_company_title' => '支付公司商户号标题', 'status' => '状态'];

        // 获取查询条件
        $map = $this->getMap();

        // 数据列表
        $data_list = PaymentTestModel::where($map)->order('id desc')->paginate();

        // 分页数据
        $page = $data_list->render();

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        $class_type = [
            0 => '半自动化测试:info',
            1 => '全自动化测试:success',
            2 => '手动测试:primary',
            3 => '订单查询验证:warning',
            4 => '代付订单查询:danger',
            5 => '提现公司余额:info',
            6 => '代付公司余额:success',
        ];

        // 手动测试
        $manual = [
            'title' => '手动测试',
            'icon' => 'fa fa-fw fa-key',
            'class' => 'btn btn-primary',
            'href' => url('manual')
        ];
        // 半自动化测试
        $semi = [
            'title' => '半自动化测试',
            'icon' => 'fa fa-fw fa-battery-half',
            'class' => 'btn btn-info',
            'href' => url('automation', ['full' => 0, 'cash' => 10, 'like_company' => 'all']),
            'data-title' => '半自动化测试',
            'data-tips' => '半自动化测试规则为,只测试开启的支付公司和开启的支付公司的子商户号'
        ];
        // 全自动化测试
        $full = [
            'title' => '全自动化测试',
            'icon' => 'fa fa-fw fa-battery-4',
            'class' => 'btn btn-success',
            'href' => url('automation', ['full' => 1, 'cash' => 10, 'like_company' => 'all']),
            'data-title' => '全自动化测试',
            'data-tips' => '全自动化测试规则为,不管支付公司和支付公司的子商户号开没有开启，都会测试'
        ];
        // 订单查询验证
        $query = [
            'title' => '订单查询验证',
            'icon' => 'fa fa-fw fa-deviantart',
            'class' => 'btn btn-warning',
            'href' => url('query')
        ];
        // 代付订单查询
        $paidQuery = [
            'title' => '代付订单查询',
            'icon' => 'fa fa-fw fa-scribd',
            'class' => 'btn btn-danger',
            'href' => url('paidQuery')
        ];
        // 提现公司余额
        $withdrawalQueryCash = [
            'title' => '提现公司余额',
            'icon' => 'fa fa-fw fa-rupee',
            'class' => 'btn btn-info',
            'href' => url('withdrawalQueryCash')
        ];
        // 代付公司余额
        $paidQueryCash = [
            'title' => '代付公司余额',
            'icon' => 'fa fa-fw fa-jpy',
            'class' => 'btn btn-success',
            'href' => url('paidQueryCash')
        ];

        $items = [
            ['id', 'ID'],
            ['company_name', '公司名称'],
            ['company_title', '公司标题'],
            ['child_company_name', '子公司商户号名称'],
            ['child_company_title', '子公司商户号标题'],
            ['type', '类型', '', '', $all_payment_type],
            ['class', '测试类型', 'status', '', $class_type],
            ['status', '状态', 'status', '', ['失败', '成功']],
            ['create_time', '创建时间', 'datetime', '', 'Y-m-d H:i:s'],
            ['right_button', '操作', 'btn']
        ];

        // 使用ZBuilder快速创建数据表格
        return ZBuilder::make('table')
            ->setPageTitle('支付测试结果') // 设置页面标题
            ->setTableName('payment_test') // 设置数据表名
            ->setPrimaryKey('id') // 设置主键名为id
            ->setSearch($search) // 设置搜索参数
            ->addColumns($items)
            ->addTopButtons('delete') // 批量添加顶部按钮
            ->addTopButton('manual', $manual) // 添加按钮
            ->addTopButton('semi', $semi) // 添加按钮
            ->addTopButton('full', $full) // 添加按钮
            ->addTopButton('query', $query) // 添加按钮
            ->addTopButton('paidQuery', $paidQuery) // 添加按钮
            ->addTopButton('withdrawalQueryCash', $withdrawalQueryCash) // 添加按钮
            ->addTopButton('paidQueryCash', $paidQueryCash) // 添加按钮
            ->addRightButton('see', ['title' => '查看', 'icon' => 'fa fa-fw fa-eye', 'href' => url('see', ['id' => '__id__'])], true)
            ->addRightButtons('delete') // 批量添加右侧按钮
            ->setRowList($data_list) // 设置表格数据
            ->setPages($page) // 设置分页数据
            ->fetch(); // 渲染页面
    }

    /**
     * 自动化测试,实现方式一,直观些
     * @return mixed
     */
    public function automation($full = 0, $cash = 10, $like_company = 'all')
    {
        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 全自动化测试为1，半自动化测试为0
            $map = $full ? [] : ['status' => 1];

            // 所有的支付公司
            $all_config_group = pay_config('config_group');
            unset($all_config_group['pay_config']);

            // 获取所有总支付公司配置
            foreach ($all_config_group as $key => $value) {
                $all_company_parent[$key] = pay_config('', $key);
                $all_company_parent[$key]['title'] = $value;
            }

            // 获取所有支付公司的子商户号配置
            $all_child_company = PaymentPayCompanyModel::where($map)->order([['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc']])->column('*', 'name');

            $all_company_group = [];
            // 支付公司的子商户号配置分组
            foreach ($all_child_company as $key => $value) {
                $all_company_group[$value['group']][] = $value['name'];
            }

            // 过滤支付公司
            if ($like_company != 'all') {
                foreach ($all_company_group as $key => $value) {
                    if (stripos($key, $like_company) !== false) {
                        $all_company_group_like[$key] = $value;
                    }
                }
                $all_company_group = isset($all_company_group_like) ? $all_company_group_like : $all_company_group;
            }

            // 发送给第三方支付公司参数
            $param['order_id'] = date('ymdHis') . random(8);                         // 平台订单号
            $param['type'] = 'alipay_h5';                                            // 支付类型
            $param['cash'] = $cash;                                                  // 支付金额
            $param['body'] = 'shang_pin_ming_cheng';                                 // 商品名称
            $param['name'] = '0';                                                    // 姓名
            $param['id_card'] = '0';                                                 // 身份证号
            $param['mobile'] = '0';                                                  // 手机号
            $param['ip'] = Request::instance()->ip();                                // 客户端ip
            $param['vip_user'] = 0;                                                  // vip用户
            $param['user_id'] = 0;                                                   // 用户id
            $param['channel_id'] = 0;                                                // 渠道id
            $param['return_url'] = Request::instance()->domain();                    // 支付完成返回界面
            $param['business_type'] = 'B2C';                                         // 业务类型
            $param['bank_code'] = 'ICBC';                                            // 银行编号
            $param['verify_param'] = date('ymdHis');                                 // 验证参数
            $param['tj_return_url'] = Request::instance()->domain();                 // 支付完成返回界面
            $param['now_time'] = time();                                             // 现在时间
            // 实例化第三方订单模型
            $other_order_obj = new AllPaymentCompanyModel();

            // 第一步：循环支付公司的子商户号配置分组
            foreach ($all_company_group as $company_parent_name => $all_company_child_name) {

                // 支付测试表字段
                $payment_test['company_name'] = $company_parent_name;              // 支付公司名称
                $payment_test['company_title'] = $all_company_parent[$company_parent_name]['title'];   // 支付公司标题
                $payment_test['child_company_name'] = '';                          // 支付公司商户号名称
                $payment_test['child_company_title'] = '';                         // 支付公司商户号标题
                $payment_test['type'] = 'alipay_h5';                               // 支付类型，默认
                $payment_test['create_param'] = '';                                // 创建参数
                $payment_test['remark'] = '';                                      // 备注
                $payment_test['class'] = $full;                                    // 全自动化测试为1，半自动化测试为0
                $payment_test['status'] = 0;                                       // 状态：0失败，1成功
                $payment_test['create_time'] = time();                             // 创建的时间
                // 判断总支付公司的方法是否存在
                if (!method_exists($other_order_obj, $company_parent_name)) {
                    $payment_test['remark'] = "支付公司模型类中，不存在指定方法，请添加{$company_parent_name}方法开发";
                    PaymentTestModel::create($payment_test);
                    continue;
                }
                // 第二步：循环支付公司下的所有子商户号
                foreach ($all_company_child_name as $company_child_name) {

                    $payment_test['child_company_name'] = $company_child_name;                                 // 支付公司商户号名称
                    $payment_test['child_company_title'] = $all_child_company[$company_child_name]['title'];   // 支付公司商户号标题
                    // 总支付公司名称配置
                    $payment_company_config = $all_company_parent[$company_parent_name];

                    // 支付公司中的子商户号配置状态
                    $children_company_config = $all_child_company[$company_child_name];

                    // 合并支付公司默认商户号和子商户号配置
                    $company_merge_values = array_merge($payment_company_config, $children_company_config);

                    // $all_supply_payment_type = $all_company_parent[$company_parent_name]['supply_payment_type'];
                    $all_supply_payment_type_json = $all_child_company[$company_child_name]['payment_type'];
                    $all_supply_payment_type = json_decode($all_supply_payment_type_json, true);

                    // 第三步：循环支付公司提供的支付类型：$supply_payment_type单个支付类型
                    foreach ($all_supply_payment_type as $supply_payment_type) {

                        $param['order_id'] = date('ymdHis') . random(6);    // 随机订单号
                        $param['type'] = $supply_payment_type;              // 支付类型
                        $company_merge_values['wait_second'] = 10;          // 请求上游等待多少秒
                        $resarray = $other_order_obj->$company_parent_name($param, $company_merge_values);

                        $payment_test['type'] = $supply_payment_type;       // 支付类型
                        if ($resarray['code'] == 200) {
                            // 成功
                            $payment_test['status'] = 1;
                            $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                            $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
                        } elseif ($resarray['code'] == 300) {
                            // 失败
                            $payment_test['status'] = 0;
                            $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                            $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
                        } else {
                            // 未知(异常)
                            $payment_test['status'] = 0;
                            $payment_test['remark'] = '未知错误';
                        }
                        PaymentTestModel::create($payment_test);
                    }
                }
            }
            $this->success('操作完成', url('index'));
        }

        $items = [
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('自动化测试') // 设置页面标题
            ->addFormItems($items)
            ->fetch();
    }

    /**
     * 自动化测试,实现方式二
     * @return mixed
     */
    public function automation2($full = 0, $cash = 1)
    {
        // 全自动化测试，还是半自动化测试
        $map = $full ? [] : ['status' => 1];
        //halt($map);
        // 所有的支付公司
        $all_config_group = pay_config('config_group');
        unset($all_config_group['pay_config']);
        //dump($all_config_group);
        // 获取所有总支付公司配置
        foreach ($all_config_group as $key => $value) {
            $all_company_parent[$key] = pay_config('', $key);
            $all_company_parent[$key]['title'] = $value;
        }
        dump($all_company_parent);
        // 获取所有支付公司的子商户号配置
        $all_child_company = PaymentPayCompanyModel::where($map)->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('*', 'name');
        //dump($all_child_company);

        $all_company_group = [];
        // 支付公司的子商户号配置分组
        foreach ($all_child_company as $key => $value) {
            $all_company_group[$value['group']][] = $value['name'];
        }
        //dump($all_company_group);
        // 发送给第三方支付公司参数
        $param['order_id'] = date('ymdHis') . random(8);                         // 平台订单号
        $param['type'] = 'alipay_h5';                                            // 支付类型
        $param['body'] = 'shang_pin_ming_cheng';                                 // 商品名称
        $param['name'] = '0';                                                    // 姓名
        $param['id_card'] = '0';                                                 // 身份证号
        $param['mobile'] = '0';                                                  // 手机号
        $param['ip'] = Request::instance()->ip();                                // 客户端ip
        $param['user_id'] = 0;                                                   // 用户id
        $param['channel_id'] = 0;                                                // 渠道id
        $param['return_url'] = Request::instance()->domain();                    // 支付完成返回界面
        $param['business_type'] = 'B2C';                                         // 业务类型
        $param['bank_code'] = 'ICBC';                                            // 银行编号
        $param['tj_return_url'] = Request::instance()->domain();                 // 支付完成返回界面
        // 实例化第三方订单模型
        $other_order_obj = new AllPaymentCompanyModel();

        // 第一步：循环所有总支付公司配置
        foreach ($all_company_parent as $company_parent_key => $company_parent_value) {
            //dump($company_parent_value);
            // 支付测试表字段
            $payment_test['company_name'] = $company_parent_key;               // 支付公司名称
            $payment_test['company_title'] = $company_parent_value['title'];   // 支付公司标题
            $payment_test['child_company_name'] = '';                          // 支付公司商户号名称
            $payment_test['child_company_title'] = '';                         // 支付公司商户号标题
            $payment_test['type'] = 'alipay_h5';                               // 支付类型，默认
            $payment_test['create_param'] = '';                                // 创建参数
            $payment_test['remark'] = '';                                      // 备注
            $payment_test['class'] = $full;                                    // 全自动化测试为1，半自动化测试为0
            $payment_test['status'] = 0;                                       // 状态：0失败，1成功
            $payment_test['create_time'] = time();                             // 创建的时间
            // 判断总支付公司的方法是否存在
            if (!method_exists($other_order_obj, $company_parent_key)) {
                $payment_test['remark'] = "支付公司模型类中，不存在指定方法，请添加{$company_parent_key}方法开发";
                PaymentTestModel::create($payment_test);
                continue;
            }
            // 提供的支付类型为空
            if (empty($company_parent_value['supply_payment_type'])) {
                $payment_test['remark'] = "支付公司模型类中，提供的支付类型为空，请在{$company_parent_value['title']}配置中勾选";
                PaymentTestModel::create($payment_test);
                continue;
            }

            // 第二步：循环支付公司提供的支付类型：$supply_payment_type单个支付类型
            foreach ($company_parent_value['supply_payment_type'] as $supply_payment_type) {
                //dump($supply_payment_type);
                // 支付公司没有子商户号
                if (empty($all_company_group[$company_parent_key])) {
                    $payment_test['remark'] = "支付公司没有配置子商户号，请在支付公司配置中{$company_parent_value['title']}分组中添加";
                    PaymentTestModel::create($payment_test);
                    // 终止本次循环
                    break;
                }

                // 循环支付公司的子商户号名称
                foreach ($all_company_group[$company_parent_key] as $child_company_name) {
                    $payment_test['child_company_name'] = $child_company_name;                                 // 支付公司商户号名称
                    $payment_test['child_company_title'] = $all_child_company[$child_company_name]['title'];   // 支付公司商户号标题
                    // 总支付公司名称配置
                    $payment_company_config = $all_company_parent[$company_parent_key];
                    dump($payment_company_config);
                    // 支付公司中的子商户号配置状态
                    $children_company_config = $all_child_company[$child_company_name];
                    dump($children_company_config);
                    // 合并支付公司默认商户号和子商户号配置
                    $company_merge_values = array_merge($payment_company_config, $children_company_config);


                    $param['order_id'] = date('ymdHis') . random(6);    // 随机订单号
                    $param['type'] = $supply_payment_type;              // 支付类型
                    $resarray = $other_order_obj->$company_parent_key($param, $company_merge_values);

                    $payment_test['type'] = $supply_payment_type;       // 支付类型
                    if ($resarray['code'] == 200) {
                        // 成功
                        $payment_test['status'] = 1;
                        $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                        $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
                    } elseif ($resarray['code'] == 300) {
                        // 失败
                        $payment_test['status'] = 0;
                        $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                        $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
                    } else {
                        // 未知(异常)
                        $payment_test['status'] = 0;
                        $payment_test['remark'] = '未知错误';
                    }
                    PaymentTestModel::create($payment_test);
                }
            }
        }
        $this->success('操作完成', url('index'));
    }

    /**
     * 手动测试
     * @return mixed
     */
    public function manual($linkage = 0)
    {
        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        // 支付公司
        $all_config_group = pay_config('config_group');
        unset($all_config_group['pay_config']);
        // 支付公司子商户号
        $all_child_company = PaymentPayCompanyModel::column('title,group', 'name');

        if ($linkage) {
            foreach ($all_child_company as $key => $value) {
                if ($linkage == $value['group']) {
                    $list[] = ['key' => $value['name'], 'value' => $value['title']];
                }
            }
            $arr['code'] = '1';          // 判断状态
            $arr['msg'] = '请求成功';    // 回传信息
            $arr['list'] = $list;        // 数据
            return json($arr);
        }

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 实例化第三方订单模型
            $other_order_obj = new AllPaymentCompanyModel();
            if ($data['manual'] == 'open') {
                // 验证
                $result = $this->validate($data, 'Test.manual');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }
                $company = pay_config('', $data['company']);
                $company_merge_values = array_merge($company, $data);
            } else {
                // 验证
                $result = $this->validate($data, 'Test.auto');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }
                $company = pay_config('', $data['company']);
                $child = PaymentPayCompanyModel::where(['name' => $data['child']])->column('*', 'name');

                $child_array = $child[$data['child']];

                // 合并支付公司默认商户号和子商户号配置
                $company_merge_values = array_merge($company, $child_array);
            }
            $company = $data['company'];

            // 发送给第三方支付公司参数
            $param['order_id'] = date('ymdHis') . random(8);                          // 平台订单号
            $param['type'] = $data['type'];                                           // 支付类型
            $param['cash'] = $data['cash'];                                           // 支付金额
            $param['body'] = 'shang_pin_ming_cheng';                                  // 商品名称
            $param['name'] = '0';                                                     // 姓名
            $param['id_card'] = '0';                                                  // 身份证号
            $param['mobile'] = '0';                                                   // 手机号
            $param['ip'] = Request::instance()->ip();                                 // 客户端ip
            $param['user_id'] = 0;                                                    // 用户id
            $param['channel_id'] = 0;                                                 // 渠道id
            $param['return_url'] = Request::instance()->domain();                     // 支付完成返回界面
            $param['business_type'] = 'B2C';                                          // 业务类型
            $param['bank_code'] = 'ICBC';                                             // 银行编号
            $param['verify_param'] = date('ymdHis');                                  // 验证参数
            $param['tj_return_url'] = Request::instance()->domain();                  // 支付完成返回界面
            $param['now_time'] = time();                                              // 现在时间
            $company_merge_values['wait_second'] = 10;                                // 请求上游等待多少秒
            $resarray = $other_order_obj->$company($param, $company_merge_values);

            $payment_test['company_name'] = $data['company'];                         // 支付公司名称
            $payment_test['company_title'] = $all_config_group[$company];             // 支付公司标题
            $payment_test['child_company_name'] = $data['child'];                     // 支付公司商户号名称
            $payment_test['child_company_title'] = $data['child'] ? $child_array['title'] : '';     // 支付公司商户号标题
            $payment_test['type'] = $data['type'];                                    // 支付类型，默认
            $payment_test['create_param'] = '';                                       // 创建参数
            $payment_test['remark'] = '';                                             // 备注
            $payment_test['class'] = 2;                                               // 手动测试2
            $payment_test['status'] = 0;                                              // 状态：0失败，1成功
            $payment_test['create_time'] = time();                                    // 创建的时间

            if ($resarray['code'] == 200) {
                // 成功
                $payment_test['status'] = 1;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
            } elseif ($resarray['code'] == 300) {
                // 失败
                $payment_test['status'] = 0;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
            } else {
                // 未知(异常)
                $payment_test['status'] = 0;
                $payment_test['remark'] = '未知错误';
            }
            PaymentTestModel::create($payment_test);
            $this->success('操作完成', url('index'));
        }

        $items = [
            ['radio', 'manual', '手动开关', '是否手动填写参数', ['close' => '关闭', 'open' => '开启'], 'close'],
            ['radio', 'type', '支付类型', '', $all_payment_type, ''],
            ['linkage', 'company', '选择支付公司', '总支付公司名称', $all_config_group, '', url('manual'), 'child', 'linkage'],
            ['select', 'child', '选择支付公司下的子商户号名称'],
            ['text', 'merchant_id', '商户号', '该公司配置的商户号'],
            ['text', 'app_id', '应用ID', '该公司配置的应用id'],
            ['textarea', 'key', '密钥', '该公司配置的密钥'],
            ['text', 'cash', '金额', '充值金额（测试）', 10],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('手动测试:创建订单') // 设置页面标题
            ->addFormItems($items)
            ->setTrigger('manual', 'open,close', 'company')
            ->setTrigger('manual', 'open', 'merchant_id,app_id,key')
            ->setTrigger('manual', 'close', 'child')
            ->fetch();
    }

    /**
     * 订单查询
     * @return mixed
     */
    public function query()
    {
        // 支付公司
        $all_config_group = pay_config('config_group');
        unset($all_config_group['pay_config']);

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 实例化第三方订单模型
            $other_order_obj = new AllPaymentCompanyModel();
            $recharge = [];
            if ($data['manual'] == 'open') {
                // 验证
                $result = $this->validate($data, 'Test.queryok');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }
                $company = pay_config('', $data['company']);
                if ($data['merchant_id'] || $data['app_id'] || $data['key']) {
                    $company_merge_values = array_merge($company, $data);
                } else {
                    $company_merge_values = $company;
                }

                $order_param = $data['other_order_id'];
                $company_parent_name = $data['company'];
                $recharge['type'] = isset($data['type']) ? $data['type'] : 'alipay_h5';
            } else {
                // 验证
                $result = $this->validate($data, 'Test.queryno');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }

                $info = OrderModel::where(['order_id' => $data['order_id']])->find();
                if (!$info) {
                    $this->error('平台订单号不存在！');
                }
                $company = pay_config('', $info['company']);
                $child = PaymentPayCompanyModel::where(['name' => $info['child_company']])->column('*', 'name');

                // 合并支付公司默认商户号和子商户号配置
                $company_merge_values = array_merge($company, $child[$info['child_company']]);

                $order_param = $info['order_id'];
                $company_parent_name = $info['company'];
                if (in_array($company_parent_name, ['haibeifu', 'ujubank', 'huifutong', 'hfnbuy', 'beifubao', 'kehupay', 'yifu', 'xiaochais', 'kjpay', 'threelink', 'qtong', 'shoumi', 'hgjpay', 'superpay', 'chaoren', 'chaorentwo'])) {
                    $order_param = $info['other_order_id'] ?: $info['verify_param'];
                }
                $recharge = $info;
            }

            $companys = $company_parent_name . 'Verify';

            $company_merge_values['wait_second'] = 15;

            // 发送给第三方支付公司订单号    
            $resarray = $other_order_obj->$companys($order_param, $company_merge_values, $recharge);

            $payment_test['company_name'] = $company_parent_name;          // 支付公司名称
            $payment_test['company_title'] = $all_config_group[$company_parent_name];  // 支付公司标题
            $payment_test['child_company_name'] = '';                      // 支付公司商户号名称
            $payment_test['child_company_title'] = '';                     // 支付公司商户号标题
            $payment_test['type'] = '';                                    // 支付类型，默认
            $payment_test['create_param'] = '';                            // 创建参数
            $payment_test['remark'] = '';                                  // 备注
            $payment_test['class'] = 3;                                    // 订单查询验证3
            $payment_test['status'] = 0;                                   // 状态：0失败，1成功
            $payment_test['create_time'] = time();                         // 创建的时间

            if ($resarray['code'] == 200) {
                // 成功
                $payment_test['status'] = 1;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
            } elseif ($resarray['code'] == 300) {
                // 失败
                $payment_test['status'] = 0;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['msg']) ? $resarray['msg'] : '';
            } else {
                // 未知(异常)
                $payment_test['status'] = 0;
                $payment_test['remark'] = '未知错误';
            }
            PaymentTestModel::create($payment_test);
            $this->success('操作完成', url('index'));
        }

        $items = [
            ['radio', 'manual', '自动验证', '是否自动验证', ['close' => '关闭', 'open' => '开启'], 'close'],
            ['select', 'company', '选择支付公司', '总支付公司名称', $all_config_group],
            ['text', 'merchant_id', '商户号', '该公司配置的商户号'],
            ['text', 'app_id', '应用ID', '该公司配置的应用id'],
            ['textarea', 'key', '密钥', '该公司配置的密钥'],
            ['text', 'order_id', '平台订单号', '输入平台订单号验证'],
            ['radio', 'type', '支付类型', '', pay_config('payment_type'), 'alipay_h5'],
            ['text', 'other_order_id', '第三方订单号', '输入第三方订单号验证'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('订单查询验证') // 设置页面标题
            ->addFormItems($items)
            ->setTrigger('manual', 'open,close')
            ->setTrigger('manual', 'open', 'company,merchant_id,app_id,key,type,other_order_id')
            ->setTrigger('manual', 'close', 'order_id')
            ->fetch();
    }

    /**
     * 代付查询
     * @return mixed
     */
    public function paidQuery()
    {
        // 支付公司
        $all_config_group = pay_config('paid_company');
        // 支付公司子商户号
        $all_child_company = PaymentPaidCompanyModel::column('title', 'name');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 实例化第三方订单模型
            if ($data['paid_class'] == 0) {
                $other_order_obj = new PaymentOrderPaidModel();
            } else {
                $other_order_obj = new PaymentOrderAlipayPaidModel();
            }

            if ($data['manual'] == 'open') {
                // 验证
                $result = $this->validate($data, 'Test.queryok');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }

                $child = PaymentPaidCompanyModel::where(['name' => $data['company']])->column('*', 'name');
                $company_merge_values = $child[$data['company']];

                if ($data['merchant_id'] || $data['app_id'] || $data['key']) {
                    $company_merge_values = array_merge($company_merge_values, $data);
                } else {
                    $company_merge_values = $company_merge_values;
                }

                $order_param = $data['other_order_id'];
                $company_parent_name = strstr($data['company'], 'Paid', true);
            } else {
                // 验证
                $result = $this->validate($data, 'Test.queryno');
                // 验证失败 输出错误信息
                if (true !== $result) {
                    $this->error($result);
                }

                if ($data['paid_class'] == 0) {
                    $info = PaidOrderModel::where(['order_id' => $data['order_id']])->find();
                } else {
                    $info = AlipayPaidOrderModel::where(['order_id' => $data['order_id']])->find();
                }

                if (!$info) {
                    $this->error('平台订单号不存在');
                }

                $child = PaymentPaidCompanyModel::where(['name' => $info['child_company']])->column('*', 'name');

                $company_merge_values = $child[$info['child_company']];

                $order_param = $info['order_id'];
                $company_parent_name = $info['company'];
                if (in_array($company_parent_name, ['abcdefg'])) {
                    $order_param = $info['other_order_id'] ?: $info['verify_param'];
                }
            }

            $other_param = isset($info) ? $info->toArray() : [];

            $companys = $company_parent_name . 'PaidQuery';

            // 发送给第三方支付公司订单号    
            $resarray = $other_order_obj->$companys($order_param, $company_merge_values, $other_param, false, false);

            $payment_test['company_name'] = $company_parent_name;          // 支付公司名称
            $payment_test['company_title'] = $all_config_group[$company_parent_name];  // 支付公司标题
            $payment_test['child_company_name'] = '';                      // 支付公司商户号名称
            $payment_test['child_company_title'] = '';                     // 支付公司商户号标题
            $payment_test['type'] = '';                                    // 支付类型，默认
            $payment_test['create_param'] = '';                            // 创建参数
            $payment_test['remark'] = '';                                  // 备注
            $payment_test['class'] = 4;                                    // 代付订单查询4
            $payment_test['status'] = 0;                                   // 状态：0失败，1成功
            $payment_test['create_time'] = time();                         // 创建的时间

            if ($resarray['code'] == 200) {
                // 成功
                $payment_test['status'] = 1;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
            } elseif ($resarray['code'] == 300) {
                // 失败
                $payment_test['status'] = 0;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
            } else {
                // 未知(异常)
                $payment_test['status'] = 0;
                $payment_test['remark'] = '未知错误';
            }
            PaymentTestModel::create($payment_test);
            $this->success('操作完成', url('index'));
        }

        $items = [
            ['radio', 'manual', '自动验证', '是否自动验证', ['close' => '关闭', 'open' => '开启'], 'close'],
            ['radio', 'paid_class', '代付类型', '', ['银行卡代付', '支付宝代付'], '0'],
            ['select', 'company', '选择代付公司', '总代付公司名称', $all_child_company],
            ['text', 'merchant_id', '商户号', '该公司配置的商户号'],
            ['text', 'app_id', '应用ID', '该公司配置的应用id'],
            ['textarea', 'key', '密钥', '该公司配置的密钥'],
            ['text', 'order_id', '平台订单号', '输入平台订单号验证'],
            ['text', 'other_order_id', '第三方订单号', '输入第三方订单号验证'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('代付订单查询') // 设置页面标题
            ->addFormItems($items)
            ->setTrigger('manual', 'open,close')
            ->setTrigger('manual', 'open', 'company,merchant_id,app_id,key,other_order_id')
            ->setTrigger('manual', 'close', 'order_id')
            ->fetch();
    }

    /**
     * 提现公司余额
     * @return mixed
     */
    public function withdrawalQueryCash()
    {
        // 提现公司
        $all_config_group = pay_config('withdrawal_company');
        // 提现公司子商户号
        $all_child_company = PaymentWithdrawalCompanyModel::order(['name' => 'asc'])->column('title', 'name');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 实例化第三方订单模型
            $other_order_obj = new PaymentWithdrawalApiModel();

            if (!$data['company']) {
                $this->error('选择提现公司！');
            }

            $child = PaymentWithdrawalCompanyModel::where(['name' => $data['company']])->column('*', 'name');
            $company_merge_values = $child[$data['company']];

            if ($data['merchant_id'] || $data['app_id'] || $data['key']) {
                $company_merge_values = array_merge($company_merge_values, $data);
            } else {
                $company_merge_values = $company_merge_values;
            }

            $company_parent_name = strstr($data['company'], 'Withdrawal', true);

            $companys = $company_parent_name . 'WithdrawalQueryCash';

            // 发送给第三方支付公司订单号    
            $resarray = $other_order_obj->$companys($company_merge_values);

            $payment_test['company_name'] = $company_parent_name;                      // 支付公司名称
            $payment_test['company_title'] = $all_config_group[$company_parent_name];  // 支付公司标题
            $payment_test['child_company_name'] = $data['company'];                    // 支付公司商户号名称
            $payment_test['child_company_title'] = $company_merge_values['title'];     // 支付公司商户号标题
            $payment_test['type'] = '';                                                // 支付类型，默认
            $payment_test['create_param'] = '';                                        // 创建参数
            $payment_test['remark'] = '';                                              // 备注
            $payment_test['class'] = 5;                                                // 提现公司余额5
            $payment_test['status'] = 0;                                               // 状态：0失败，1成功
            $payment_test['create_time'] = time();                                     // 创建的时间

            if ($resarray['code'] == 200) {
                // 成功
                $payment_test['status'] = 1;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
                $payment_test['type'] = $resarray['cash'] . ' 元';         // 显示金额
            } elseif ($resarray['code'] == 300) {
                // 失败
                $payment_test['status'] = 0;
                $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
            } else {
                // 未知(异常)
                $payment_test['status'] = 0;
                $payment_test['remark'] = '未知错误';
            }
            PaymentTestModel::create($payment_test);
            $this->success('操作完成', url('index'));
        }

        $items = [
            ['select', 'company', '选择提现公司', '总提现公司名称', $all_child_company],
            ['text', 'merchant_id', '商户号', '该公司配置的商户号'],
            ['text', 'app_id', '应用ID', '该公司配置的应用id'],
            ['textarea', 'key', '密钥', '该公司配置的密钥'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('提现公司余额') // 设置页面标题
            ->addFormItems($items)
            ->fetch();
    }

    /**
     * 代付公司余额
     * @return mixed
     */
    public function paidQueryCash()
    {
        // 代付公司
        $all_config_group = pay_config('paid_company');
        // 代付公司子商户号
        $query_status = [];
        if ($this->role > $this->have_auth) {
            $query_status = ['status' => 1];
        }
        $all_child_company = PaymentPaidCompanyModel::where($query_status)->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('title', 'name');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            if (empty($data['company'])) {
                $this->error('选择代付公司！');
            }

            foreach ($data['company'] as $company_id) {

                $child = PaymentPaidCompanyModel::where(['name' => $company_id])->column('*', 'name');
                $company_merge_values = $child[$company_id];

                if ($data['merchant_id'] && $data['app_id'] && $data['key']) {
                    $company_merge_values = array_merge($company_merge_values, $data);
                } else {
                    $company_merge_values = $company_merge_values;
                }

                $company_parent_name = strstr($company_id, 'Paid', true);

                $companys = $company_parent_name . 'PaidQueryCash';

                // 实例化第三方订单模型
                if ($company_merge_values['paid_class'] == 0) {
                    $other_order_obj = new PaymentOrderPaidModel();
                    $payment_test['paid_class'] = 0;
                } else {
                    $other_order_obj = new PaymentOrderAlipayPaidModel();
                    $payment_test['paid_class'] = 1;
                }

                // 发送给第三方支付公司订单号    
                $resarray = $other_order_obj->$companys($company_merge_values);

                $payment_test['company_name'] = $company_parent_name;                      // 支付公司名称
                $payment_test['company_title'] = $all_config_group[$company_parent_name];  // 支付公司标题
                $payment_test['child_company_name'] = $company_id;                         // 支付公司商户号名称
                $payment_test['child_company_title'] = $company_merge_values['title'];     // 支付公司商户号标题
                $payment_test['type'] = '';                                                // 支付类型，默认
                $payment_test['create_param'] = '';                                        // 创建参数
                $payment_test['remark'] = '';                                              // 备注
                $payment_test['class'] = 6;                                                // 代付公司余额6
                $payment_test['status'] = 0;                                               // 状态：0失败，1成功
                $payment_test['create_time'] = time();                                     // 创建的时间

                if ($resarray['code'] == 200) {
                    // 成功
                    $payment_test['status'] = 1;
                    $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                    $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
                    $payment_test['type'] = $resarray['cash'] . ' 元';         // 显示金额
                } elseif ($resarray['code'] == 300) {
                    // 失败
                    $payment_test['status'] = 0;
                    $payment_test['create_param'] = isset($resarray['data']) ? $resarray['data'] : '';
                    $payment_test['remark'] = isset($resarray['return_param']) ? $resarray['return_param'] : '';
                } else {
                    // 未知(异常)
                    $payment_test['status'] = 0;
                    $payment_test['remark'] = '未知错误';
                }
                PaymentTestModel::create($payment_test);
            }

            $this->success('操作完成', url('index'));
        }

        $items = [
            ['radio', 'manual', '自动验证', '是否自动验证', ['close' => '关闭', 'open' => '开启'], 'close'],
            // ['select', 'company', '选择代付公司', '总代付公司名称', $all_child_company],
            ['checkbox', 'company', '选择代付公司', '', $all_child_company,],
            ['text', 'merchant_id', '商户号', '该公司配置的商户号'],
            ['text', 'app_id', '应用id', '该公司配置的应用id'],
            ['textarea', 'key', '密钥', '该公司配置的密钥'],
            ['textarea', 'public_key', '商户公钥', '该公司配置的商户公钥'],
            ['textarea', 'other_public_key', '其他公钥', '该公司配置的其他公钥'],
            ['textarea', 'other_one', '参数一', '其它参数一'],
            ['textarea', 'other_two', '参数二', '其它参数二'],
            ['textarea', 'other_three', '参数三', '其它参数三'],
            ['textarea', 'other_four', '参数四', '其它参数四'],
            ['textarea', 'other_five', '参数五', '其它参数五'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('代付公司余额') // 设置页面标题
            ->setTrigger('manual', 'open,close')
            ->setTrigger('manual', 'open', 'company,merchant_id,app_id,key,public_key,other_public_key,other_one,other_two,other_three,other_four,other_five')
            ->setTrigger('manual', 'open,close', 'company')
            ->addFormItems($items)
            ->fetch();
    }

    /**
     * 查看
     * @param null $id 
     * @return mixed
     */
    public function see($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        // 获取数据
        $info = PaymentTestModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        $info['type'] = isset($all_payment_type[$info['type']]) ? $all_payment_type[$info['type']] : '';
        $info['status'] = $info['status'] ? '成功' : '失败';
        $info['create_param'] = $info['create_param'] ? format_nice($info['create_param']) : '';
        $info['remark'] = $info['remark'] ? format_nice($info['remark']) : '';
        $items = [
            ['hidden', 'id', $id],
            ['static', 'company_name', '支付公司名称'],
            ['static', 'company_title', '支付公司标题'],
            ['static', 'child_company_name', '支付公司商户号名称'],
            ['static', 'child_company_title', '支付公司商户号标题'],
            ['static', 'type', '支付类型'],
            ['textarea', 'create_param', '创建参数', '', '', '', ''],
            ['textarea', 'remark', '备注', '', '', '', ''],
            ['static', 'status', '状态'],
            ['datetime', 'create_time', '创建时间', '', '', 'YYYY-MM-DD HH:mm:ss', 'disabled'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('查看') // 设置页面标题
            ->addFormItems($items)
            ->hideBtn('submit')
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 删除
     * @param array $record 
     * @return mixed
     */
    public function delete($record = [])
    {
        return $this->setStatus('delete');
    }
}
